home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Rekt_ayMæk / Source / MyVUMeterPeriodical.cpp < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.7 KB  |  160 lines

  1. // MyVUMeterPeriodical.cpp
  2. // Gregory Lo
  3. // 22 June 2000 (MacHack 2000)
  4.  
  5.  
  6. #include "MyVUMeterPeriodical.h"
  7. #include <Sound.h>
  8. #include <Events.h>
  9. #include <DrawSprocket.h>
  10.  
  11. #include <LPeriodical.h>
  12.  
  13.  
  14. MyVUMeterPeriodical::MyVUMeterPeriodical( void )
  15.     :    mIntensity(kVUMeterMaxIntensity), 
  16.         mDstIntensity(0), 
  17.         mLastUpdateTime(0), 
  18.         mVelocity(kVUMeterVelocityDown)
  19. {
  20.     ::DSpStartup();
  21.     
  22.     OSErr    err = noErr;
  23.     //Open the sound input device
  24.     err = ::SPBOpenDevice( nil, siWritePermission, &mSIRefNum );
  25.  
  26.     short meterState = 1;
  27.     err = ::SPBSetDeviceInfo( mSIRefNum, siLevelMeterOnOff, (Ptr)&meterState );
  28.  
  29.     ::HideCursor();
  30. }
  31.  
  32. MyVUMeterPeriodical::~MyVUMeterPeriodical( void )
  33. {
  34.     Reset();
  35.     ::DSpShutdown();
  36.  
  37.     //We're done so close the device
  38.     OSErr err = ::SPBCloseDevice( mSIRefNum );
  39.     
  40.     ::InitCursor();
  41. }
  42.  
  43. void
  44. MyVUMeterPeriodical::SpendTime( const EventRecord&    inMacEvent )
  45. {
  46.     switch ( inMacEvent.what )
  47.     {
  48.         case keyDown:
  49.         {
  50.             PulseTo();
  51.             break;
  52.         }
  53.  
  54.         case autoKey:
  55.         {
  56.             mVelocity = kVUMeterVelocityUp;
  57.             break;
  58.         }
  59.         
  60.         default:
  61.         {
  62.             {
  63.                 static bool sbCursorIsHidden = true;
  64.             
  65.                 if ( LCommander::GetTarget() == nil && sbCursorIsHidden )
  66.                 {
  67.                     ::ShowCursor();
  68.                     sbCursorIsHidden = false;
  69.                 }
  70.                 else if ( LCommander::GetTarget() != nil && !sbCursorIsHidden )
  71.                 {
  72.                     ::HideCursor();
  73.                     sbCursorIsHidden = true;
  74.                 }
  75.             }
  76.         
  77.             UInt32 now = ::TickCount();
  78.  
  79.             if ( now > mLastUpdateTime + kkVUMeterDelay )
  80.             {
  81.                 struct soundLevelData {
  82.                     short meterState;
  83.                     short meterSetting;
  84.                 } theInfo;
  85.  
  86.                 OSErr err = ::SPBGetDeviceInfo( mSIRefNum, siLevelMeterOnOff, (Ptr)&theInfo );
  87.                 
  88.                 if ( theInfo.meterSetting > 0 )
  89.                 {
  90.                     SInt32 level = ( theInfo.meterSetting * 100 ) / 255;
  91.                     PulseTo( (level<6) ? level+5 : level );
  92.                 }
  93.  
  94.                 mLastUpdateTime = now;
  95.  
  96.                 mIntensity += mVelocity;
  97.                 
  98.                 if ( mIntensity > mDstIntensity )
  99.                 {
  100.                     mIntensity = mDstIntensity;
  101.                     mVelocity = -kVUMeterVelocityDown;
  102.                 }
  103.                 else if (  mIntensity < kVUMeterMinIntensity )
  104.                 {
  105.                     mIntensity = kVUMeterMinIntensity;
  106.                 }
  107.  
  108.                 OSStatus status = ::DSpContext_FadeGamma( 0, mIntensity, 0 );
  109.             }
  110.             break;
  111.         }
  112.     }
  113. }
  114.  
  115. void
  116. MyVUMeterPeriodical::Pulse( SInt32 inPulse )
  117. {
  118.     mDstIntensity = kVUMeterMaxIntensity;
  119.     mVelocity = inPulse;
  120. }
  121.  
  122. void
  123. MyVUMeterPeriodical::PulseTo( SInt32 inPulseTo )
  124. {
  125.     if ( mDstIntensity < inPulseTo || mVelocity < 0 )
  126.     {
  127.         mDstIntensity = inPulseTo;
  128.         mVelocity = kVUMeterPulse;
  129.     }
  130. }
  131.  
  132. void
  133. MyVUMeterPeriodical::Reset( void )
  134. {
  135.     OSStatus status = ::DSpContext_FadeGamma( 0, 100, 0 );
  136. }
  137.  
  138. void
  139. MyVUMeterPeriodical::Toggle( void )
  140. {
  141.     if ( IsRepeating() )
  142.     {
  143.         StopRepeating();
  144.         Reset();
  145.     }
  146.     else
  147.     {
  148.         StartRepeating();
  149.     }
  150. }
  151.  
  152. MyVUMeterPeriodical&
  153. MyVUMeterPeriodical::Instance( void )
  154. {
  155.     static MyVUMeterPeriodical sInstance;
  156.     return sInstance;
  157. }
  158.  
  159.  
  160.